package es.nadalgoyo.frikiquest.bbdd.tablas;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import es.nadalgoyo.frikiquest.excel.PreguntasExcel;
import es.nadalgoyo.frikiquest.ftp.FtpCliente;
import es.nadalgoyo.frikiquest.vo.PreguntasVO;
import es.sergionadal.mvc.bbdd.tablas.Tabla;
import es.sergionadal.mvc.vo.CampoVO;
import es.sergionadal.mvc.vo.ForeignKeyVO;

public class TablaPreguntas extends Tabla {

	private CampoVO campoIDTema;

	public static final String TEXTO = "texto";

	public static final String MEDIA = "media";

	public static final String CONCURRENCIA = "concurrencia";

	public static final String PUNTOS = "puntos";

	public static final String ID_TEMA = "idtema";

	private PreguntasExcel excel;

	private Activity activity;

	private FtpCliente cliente;

	public FtpCliente getCliente() {
		return cliente;
	}

	public void setCliente(FtpCliente cliente) {
		this.cliente = cliente;
	}

	public Activity getActivity() {
		return activity;
	}

	public void setActivity(Activity activity) {
		this.activity = activity;
	}

	public TablaPreguntas() {
		super("frikipreguntas");

		campoIDTema = new CampoVO(ID_TEMA, CampoVO.INTEGER);
	}

	@Override
	protected List<CampoVO> getCamposChild() {
		List<CampoVO> campos = new ArrayList<CampoVO>();
		campos.add(getId());
		campos.add(new CampoVO(TEXTO, CampoVO.TEXT));
		campos.add(new CampoVO(MEDIA, CampoVO.BLOB));
		campos.add(new CampoVO(CONCURRENCIA, CampoVO.INTEGER));
		campos.add(new CampoVO(PUNTOS, CampoVO.INTEGER));
		campos.add(campoIDTema);
		return campos;
	}

	@Override
	public ArrayList<ForeignKeyVO> getForeignKey(
			es.sergionadal.mvc.bbdd.tablas.ListTablas tablas) {
		ArrayList<ForeignKeyVO> fk = new ArrayList<ForeignKeyVO>();
		TablaTemas tablaTemas = (TablaTemas) tablas.getTabla(ListTablas.TEMAS);
		fk.add(new ForeignKeyVO(tablaTemas, tablaTemas.getId(), campoIDTema));
		return fk;
	}

	@Override
	public long insert(SQLiteDatabase db) {
		ContentValues nuevoRegistro = new ContentValues();
		long result = -1;
		for (PreguntasVO preg : excel.getPreguntas(activity, cliente)) {
			nuevoRegistro.put(ID, preg.getId());
			nuevoRegistro.put(TEXTO, preg.getTexto());
			nuevoRegistro.put(CONCURRENCIA, preg.getConcurrencia());
			nuevoRegistro.put(PUNTOS, preg.getPuntos());
			nuevoRegistro.put(ID_TEMA, preg.getIdTema());
			nuevoRegistro.put(MEDIA, preg.getMedia());
			result = db.insertWithOnConflict(getName(), null, nuevoRegistro,
					SQLiteDatabase.CONFLICT_REPLACE);
			if (result == -1)
				return result;
		}

		return result;
	}

	public void updateConcurrencia(SQLiteDatabase db, PreguntasVO preg) {
		ContentValues valores = new ContentValues();
		valores.put(CONCURRENCIA, preg.getConcurrencia());

		db.updateWithOnConflict(getName(), valores, getParameterField(ID),
				new String[] { preg.getId() }, SQLiteDatabase.CONFLICT_REPLACE);
	}

	@Override
	public void update(SQLiteDatabase db, String[] args) {
		ContentValues valores = new ContentValues();

		for (PreguntasVO preg : excel.getPreguntas(activity, cliente)) {
			valores.put(TEXTO, preg.getTexto());
			valores.put(CONCURRENCIA, preg.getConcurrencia());
			valores.put(PUNTOS, preg.getPuntos());
			valores.put(ID_TEMA, preg.getIdTema());
			db.update(getName(), valores, getParameterField(ID), args);
		}
	}

	public void setPreguntasExcel(PreguntasExcel excel) {
		this.excel = excel;
	}

	public List<PreguntasVO> getPreguntas(SQLiteDatabase db) {
		Cursor cursor = getAll(db);
		List<PreguntasVO> preguntas = new ArrayList<PreguntasVO>();

		return getListPreguntas(cursor);
	}

	public PreguntasVO getPregunta(SQLiteDatabase db, String id) {
		Cursor cursor = getRegistroPerID(db, id);
		PreguntasVO pregunta = null;
		if (cursor.moveToFirst()) {// && !cursor.moveToNext()) {
			pregunta = new PreguntasVO(cursor.getString(0),
					cursor.getString(1), cursor.getString(2),
					cursor.getString(3));
		}

		if (cursor != null && !cursor.isClosed()) {
			cursor.close();
		}
		return pregunta;
	}

	public List<PreguntasVO> getPreguntasConcurrencia(SQLiteDatabase db,
			String idTema) {

		String sql = getSQLPreguntaConcurrencia();

		if (idTema != null)
			sql = sql.concat(" AND ").concat(ID_TEMA).concat(" = ")
					.concat(idTema);

		Cursor cursor = db.rawQuery(sql, null);

		return getListPreguntas(cursor);
	}

	private List<PreguntasVO> getListPreguntas(Cursor cursor) {
		List<PreguntasVO> preguntas = new ArrayList<PreguntasVO>();
		if (cursor.moveToFirst()) {
			do {
				int id = cursor.getColumnIndex(ID);
				int texto = cursor.getColumnIndex(TEXTO);
				int idTema = cursor.getColumnIndex(ID_TEMA);
				int concurrencia = cursor.getColumnIndex(CONCURRENCIA);
				int puntos = cursor.getColumnIndex(PUNTOS);
				int media = cursor.getColumnIndex(MEDIA);
				preguntas.add(new PreguntasVO(cursor.getString(id), cursor
						.getString(texto), cursor.getString(idTema), cursor
						.getString(concurrencia), cursor.getString(puntos),
						cursor.getBlob(media)));
			} while (cursor.moveToNext());
		}

		if (cursor != null && !cursor.isClosed()) {
			cursor.close();
		}
		return preguntas;
	}

	private String getSQLPreguntaConcurrencia() {
		StringBuffer sb = new StringBuffer();
		sb.append("SELECT * ");
		sb.append("FROM ".concat(getName()).concat(" "));
		sb.append("WHERE ".concat(CONCURRENCIA).concat(" =( "));
		sb.append("SELECT MIN(".concat(CONCURRENCIA).concat(") "));
		sb.append("FROM ".concat(getName()).concat(" "));
		sb.append(")");
		return sb.toString();
	}

}
